package negocio.bd;

import base.Presupuesto;
import base.Servicio;
import java.sql.SQLException;
import java.util.ArrayList;
import utiles.ConexionBD;
import utiles.ConversorFecha;
import utiles.Logger;

/**
 * Clase para el manejo de los presupuestos en la base de datos.
 * @author Efren
 * @version 0.0.1
 * @since 16/02/2013
 */
public class BDPresupuestos {
    public static final String idPresupuesto = "idPresupuesto";
    public static final String fechaGenerado = "fechaGenerado";
    public static final String idResponsable = "idTecnicoResponsable";
    public static final String aceptado = "aceptado";
    public static final int buscarPorId = 0;
    public static final int buscarPorFecha = 2;
    public static final int buscarPorResponsable = 3;
    public static final int buscarAceptados = 4;
    public static final int ASC = 1;
    public static final int DESC = 2;
    public static final int DEFAULT_ORDER = 0;
    
    public static Presupuesto[]  buscar(int campoBusqueda, String busqueda, int orden, boolean exacta){
        java.sql.Connection db = new ConexionBD().getConnection();
        ArrayList<Presupuesto> presupuestos = new  ArrayList<>(0);
        String query = "SELECT * FROM `gestionTienda`.`Presupuestos` ";
        switch (campoBusqueda){
            case buscarPorFecha:
                query += "WHERE " + fechaGenerado + " like " + busqueda +"% ORDER BY " + fechaGenerado;
                break;
            case buscarPorResponsable:
                query += "WHERE " + idResponsable + " like " + busqueda + "% ORDER BY " + fechaGenerado;
                break;
            case buscarAceptados:
                query += "WHERE " + aceptado + " like " + busqueda + "% ORDER BY " + fechaGenerado;
                break;
            default:
                query += "WHERE " + idPresupuesto + " like " + busqueda + "% ORDER BY " + fechaGenerado;
        }
        //Si la busqueda a de ser exacta quitar like y % de la consulta
        if (exacta){
            query = query.replaceAll("like", "=");
            query = query.replace("%", "");
        }
        if (orden != DEFAULT_ORDER){
            if (orden == DESC){
                query += " DESC";
            } else {
                query += " ASC";
            }
        }
        try {
            java.sql.Statement statement = db.createStatement();
            java.sql.ResultSet res = statement.executeQuery(query);
            while (res.next()){
                Presupuesto temp = new Presupuesto();
                temp.setIdPresupuesto(res.getLong(idPresupuesto));
                temp.setFecha(ConversorFecha.obtenerFecha(res.getString(fechaGenerado)));
                temp.setIdTecnicoResponsable(res.getInt(idResponsable));
                int saceptado = res.getInt(aceptado);
                if (saceptado == 1){
                    temp.aceptar();
                }else {
                    temp.denegar();
                }
                temp.setServiciosEstimados(BDServicios.obtenerPrevistos(temp.getIdPresupuesto(), temp.getFecha()));
                presupuestos.add(temp);
            }
            return presupuestos.toArray(new Presupuesto[0]);
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }
        return null;
    }
    public static Presupuesto obtenerUltimo(long idPresupuesto){
        java.sql.Connection db = new ConexionBD().getConnection();
        try {
            java.sql.Statement select = db.createStatement();
            String a = "SELECT * FROM `gestionTienda`.`Presupuestos` WHERE " + BDPresupuestos.idPresupuesto + " = " + idPresupuesto + " order by fechaGenerado DESC";
            java.sql.ResultSet res = select.executeQuery(a);
            if (res.next()){
                Presupuesto presupuesto = new Presupuesto();
                presupuesto.setIdPresupuesto(res.getLong(BDPresupuestos.idPresupuesto));
                presupuesto.setFecha(ConversorFecha.obtenerFecha(res.getString(fechaGenerado)));
                presupuesto.setIdTecnicoResponsable(res.getInt(idResponsable));
                if (res.getInt(aceptado) == 1){
                    presupuesto.aceptar();
                } else {
                    presupuesto.denegar();
                }
                presupuesto.setServiciosEstimados(BDServicios.obtenerPrevistos(presupuesto.getIdPresupuesto(), presupuesto.getFecha()));
                return presupuesto;
            }
        }catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return null;
    }
    public static Presupuesto[] obtenerPresupuestos(long idPresupuesto){
        java.sql.Connection db = new ConexionBD().getConnection();
        ArrayList<Presupuesto> presupuestos = new ArrayList<Presupuesto>();
        try {
            java.sql.Statement select = db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`Presupuestos` WHERE " + BDPresupuestos.idPresupuesto + " = " + idPresupuesto);
            while (res.next()){
                Presupuesto presupuesto = new Presupuesto();
                presupuesto.setIdPresupuesto(res.getLong(BDPresupuestos.idPresupuesto));
                presupuesto.setFecha(ConversorFecha.obtenerFecha(res.getString(fechaGenerado)));
                presupuesto.setIdTecnicoResponsable(res.getInt(idResponsable));
                if (res.getInt(aceptado) == 1){
                    presupuesto.aceptar();
                } else {
                    presupuesto.denegar();
                }
                presupuesto.setServiciosEstimados(BDServicios.obtenerPrevistos(presupuesto.getIdPresupuesto(), presupuesto.getFecha()));
                presupuestos.add(presupuesto);
            }
            return presupuestos.toArray(new Presupuesto[0]);
        }catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return null;
    }
    public static Presupuesto[] obtenerPresupuestosDESC(long idPresupuesto){
        java.sql.Connection db = new ConexionBD().getConnection();
        ArrayList<Presupuesto> presupuestos = new ArrayList<Presupuesto>();
        try {
            java.sql.Statement select = db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`Presupuestos` WHERE " + BDPresupuestos.idPresupuesto + " = " + idPresupuesto + " ORDER BY fechaGenerado DESC");
            while (res.next()){
                Presupuesto presupuesto = new Presupuesto();
                presupuesto.setIdPresupuesto(res.getLong(BDPresupuestos.idPresupuesto));
                presupuesto.setFecha(ConversorFecha.obtenerFecha(res.getString(fechaGenerado)));
                presupuesto.setIdTecnicoResponsable(res.getInt(idResponsable));
                if (res.getInt(aceptado) == 1){
                    presupuesto.aceptar();
                } else {
                    presupuesto.denegar();
                }
                presupuesto.setServiciosEstimados(BDServicios.obtenerPrevistos(presupuesto.getIdPresupuesto(), presupuesto.getFecha()));
                presupuestos.add(presupuesto);
            }
            return presupuestos.toArray(new Presupuesto[0]);
        }catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return null;
    }
    public static boolean existe(long idPresupuesto){
        java.sql.Connection db = new ConexionBD().getConnection();
        try {
            java.sql.Statement select = db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`Presupuestos` WHERE " + BDPresupuestos.idPresupuesto + " = " + idPresupuesto);
            if (res.next()){
                return true;
            }
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return false;
    }
    
    public static Presupuesto[] obtenerTodos(){
        java.sql.Connection db = new ConexionBD().getConnection();
        ArrayList<Presupuesto> presupuestos = new ArrayList<>(0);
        try {
            java.sql.Statement select = db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`Presupuestos`");
            while (res.next()){
                Presupuesto temp = new Presupuesto();
                temp.setIdPresupuesto(res.getLong(idPresupuesto));
                temp.setFecha(ConversorFecha.obtenerFecha(res.getString(fechaGenerado)));
                temp.setIdTecnicoResponsable(res.getInt(idResponsable));
                int saceptado = res.getInt(aceptado);
                if (saceptado == 1){
                    temp.aceptar();
                }else {
                    temp.denegar();
                }
                temp.setServiciosEstimados(BDServicios.obtenerPrevistos(temp.getIdPresupuesto(), temp.getFecha()));
                presupuestos.add(temp);
            }
            return presupuestos.toArray(new Presupuesto[0]);
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return null;
    }
    public static boolean insertar(Presupuesto presupuesto){
        //if (!existe(presupuesto.getIdPresupuesto())){
            java.sql.Connection db = new ConexionBD().getConnection();
            try {
                java.sql.PreparedStatement insert = db.prepareStatement("INSERT INTO `gestionTienda`. `Presupuestos` VALUES (?,?,?,?)");
                insert.setLong(1, presupuesto.getIdPresupuesto());
                insert.setString(2, ConversorFecha.getFechaFormatoBD(presupuesto.getFecha()));
                insert.setInt(3, presupuesto.getIdTecnicoResponsable());
                if (presupuesto.isAceptado()){
                    insert.setInt(4, 1);
                } else {
                    insert.setInt(4,0);
                }
                insertarEstimados(presupuesto);
                insert.executeUpdate();
                return true;
            } catch (SQLException ex){
                Logger.printError(ex.getMessage());
            }
        //}
            return false;
    }
    public static boolean actualizar(Presupuesto presupuesto){
        if (existe(presupuesto.getIdPresupuesto())){
            java.sql.Connection db = new ConexionBD().getConnection();
            try {
                java.sql.PreparedStatement update = db.prepareStatement("UPDATE `gestionTienda`.`Presupuestos` SET " + fechaGenerado + " = ? " + idResponsable + " = ? " + aceptado +" = ? WHERE " + BDPresupuestos.idPresupuesto + " = ?");
                update.setString(1,ConversorFecha.getFechaFormatoBD(presupuesto.getFecha()));
                update.setInt(2, presupuesto.getIdTecnicoResponsable());
                if (presupuesto.isAceptado()){
                    update.setInt(3, 1);
                } else {
                    update.setInt(3,0);
                }
                update.setLong(4, presupuesto.getIdPresupuesto());
                actualizarEstimados(presupuesto);
                if (update.executeUpdate()==1){
                    return true;
                }
            } catch (SQLException ex){
                Logger.printError(ex.getMessage());
            }
        }return false;
    }
    /**
     * Método privado que inserta los servicios estimados en el presupuesto. Este método no comprueba la existencia de los servicios antes de añadirlos no comprueba que ya existan en la relación.
     * Recomendado solo para la creación del presupuesto. Para actualizaciones emplear el método actualizarEstimados.
     * @param presupuesto presupuesto del que se van a obtener los servicios
     * @return verdadero si ha finalizado correctamente  y falso en caso contrario.
     */
    private static boolean insertarEstimados(Presupuesto presupuesto) {
        java.sql.Connection db = new ConexionBD().getConnection();
        try {
            java.sql.PreparedStatement insert = db.prepareStatement("INSERT INTO `gestionTienda`.`Servicios_estimados_Presupuesto` VALUES (?,?,?,?)");
            for (Servicio temp : presupuesto.getServiciosEstimados()){
                insert.setInt(1, temp.getIdServicio());
                insert.setLong(2, presupuesto.getIdPresupuesto());
                insert.setInt(3, temp.getUnidades());
                insert.setString(4, ConversorFecha.getFechaFormatoBD(presupuesto.getFecha()));
                insert.executeUpdate();
            }
            return true;
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return false;
    }

    private static void actualizarEstimados(Presupuesto presupuesto) {
        java.sql.Connection db = new ConexionBD().getConnection();
        Servicio[] estimadosBD = BDServicios.obtenerPrevistos(presupuesto.getIdPresupuesto(), presupuesto.getFecha());
        try {
            if ( estimadosBD == null){
                //Si no hay servicios añadidos realizamos insercion.
                insertarEstimados(presupuesto);
            } else {
                java.sql.Statement delete = db.createStatement();
                delete.executeUpdate("DELETE FROM `gestionTienda`.`Servicios_estimados_Presupuesto` WHERE idPresupuesto = " + presupuesto.getIdPresupuesto());
                insertarEstimados(presupuesto);
            }
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }
    }
}
